昨天的鐵人賽是不是很輕鬆,但是寫過專案的人一定知道不可能單單印出Hello World~就可以,所以這幾天會來講一些在開發前應該要知道的觀念,像今天就要來介紹C#語言中基本的架構與用法,話不多說就直接開始今天的主題吧~
一開始我們先在終端機打上dotnet new console -o program
就會創出跟昨天很類似的資料夾,由於前面的部分我還沒開始說 Webapi 所以用 console 來就可以了,再來我們先來看看這程式碼裡面有甚麼東西
using System;
namespace program;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("hello world");
}
}
那我們就來一行一行說明好了
using System;
namespace program;
有寫過Python的人應該對import不陌生,在 C# 裡using
的用法很相似,他會引用你所指定的命名空間(namespace),所以它跟namespace
是不可分離的好友,這裡提醒一下,記得在命名namespace
時記得不要拼錯字,不然你會很想殺人~~~
class Program {}
再來是 class,當你定義一個 class 時,就等於定義了一個數據類型的藍圖,換個說法把class想成是一個鍋子,Method、Property、field這些東西就像是你要料理的食材、調味料等等
static void Main(string[] args)
{
Console.WriteLine("hello world");
}
接下來是這幾個裡面算最重要的地方,我們在執行任何程式時都要有一入口開始執行程式,這裡Main()
就扮演了這角色,但在 .NET 較新的版本也開始省略用 Main()
但在Program.cs這檔案裡的程式就有如在Main()裡一樣,裡面特別介紹static
代表是個靜態物件,void
指的是它不會回傳任何值,如果有興趣他們的人可以自己去找看看
C# 中有兩種型別:實值型別
和參考型別
實質型別有可分為簡單型別
、列舉型別
、結構型別
和可為 Null 的實值型別
,而且變數的記憶體是存放實際的值。
簡單型別:可以是我們最常見到的int、long、bool、char...,這些都屬於簡單型別
枚舉類型:常見的個是如 enum <enum_name> {enumeration list}
,記得enumeration list
的值只能是數字不能是其他型別
class Program
{
enum person{
mon = 1, tue, wed, thu, fri, sat = 10, sun
}
static void Main(string[] args)
{
int sun = (int) person.sun;
int mon = (int) person.mon;
Console.WriteLine("Sun = {0}", sun);
Console.WriteLine("Sun = {0}", mon);
}
}
結構型別:它可以說是一個量身訂做的型別,它可以依需求訂到自己要的型態,通常會用到struct
來達到目的,這裡我假設要為一個學生訂個型別我就可以寫成
struct student{
public string name; // 名子
public int number; // 學號
public bool sex; // 性別
public float height; // 身高
public float weight; // 體重
}
再來我們來使用我們寫好的結構型態
Student S1;
S1.name = "小名";
S1.number = 123;
S1.sex = true;
S1.height = 180.0;
S1.weight = 50;
Console.WriteLine("name = {0}", S1.name);
Console.WriteLine("number = {0}", S1.number);
Console.WriteLine("sex = {0}", S1.sex);
Console.WriteLine("height = {0}", S1.height);
Console.WriteLine("weight = {0}", S1.weight);
最後來看看出來的結果
name = 小名
number = 123
sex = True
height = 180
weight = 50
對了,記得在自訂結構時是不能有參數的要記得,不然一定會出錯!!!
Null 的實值型別:說實話其實我也不是很了解,但大致上應該可以說是「不存在」、「沒有」、「無」或「空」的意思吧~~~
有興趣大家可以看一下個屬性的差別!!!
參考型別的話也可以分為四種類別型別
、介面型別
、陣列型別
和委派型別
,它跟實值型別差別再,它的變數的記憶體空間是存放值記憶體的位置不是存儲值
類別型態:由於類別型態的運用範圍很廣,在使用上常看見的有物件(object)、字串(string)、自訂類別(class name{...})等等,其實還有很多但這不太會是我這次主要討論的點,如果後面有遇到我再來找看看怎麼說
介面型別:定義是所有繼承介面的類別必須遵守的語法合約(聽起來有夠抽象的),簡單說介面負責定義「做什麼」,而類別則負責定義「怎麼做」
這裡就來簡單做個操作
interface IAnimal
{
void animalSound(string message);
void animalSound();
}
class Pig : IAnimal
{
public void animalSound(string message)
{
Console.WriteLine(message);
}
public void animalSound()
{
Console.WriteLine("The pig says: hello!");
}
}
class Program
{
static void Main(string[] args)
{
Pig pig = new Pig();
pig.animalSound();
pig.animalSound("The pig says: wee wee");
}
}
跑完後出來的結果應該會是
The pig says: hello!
The pig says: wee wee
這裡要注意一下,如果 clas s和 interface 裡的method都要被使用到,不然會出現「未實作介面成員」的問題,method裡的參數也要設定對喔!!!
陣列類型:陣列基本上非為單一維度和多維度,寫法也很簡單<元素型別>[陣列常數] 陣列名稱;
int[5] nums = {0, 1, 2, 3, 4};
string[] levels = {"lv1", "lv2", "lv3"};
int[,] nums = {{0, 1, 2}, {3, 4, 5}};
前面這種陣列是有對其的,但又有另一種不規則的寫法。
int[][] numbers = {
new int[] { 1, 2 },
new int[] { 3, 4, 5, 6, 7, 8, 9 },
new int[] { 10,11 }
};
委派型別:Delegate又稱「委派型別」,你可以把它當成用來儲存事件
的資料型態,舉例像我們要儲存數值是會運用到int、float等等的元素型別,委派型別就有點像是做這樣的事,下面我簡單來介紹如何使用委派型別吧
委派怎麼寫呢,只需要委派的地方前加上 delegate 即可
private delegate int DelegateTest(int x);
這裡我使用了三種方式來如何使用委派型別,第一種方式是採用指定定義的方法,我們直接對到我們所要指定的方式就行了
static void Main(string[] args)
{
int i = 1;
DelegateTest delegateTest = AddOne;
i = delegateTest(i);
Console.WriteLine(i);
}
public static int AddOne(int x)
{
return ++x;
}
第二種方式,是直接實作的方法,我們直接把我們要做的事寫進delegate
裡
int i = 1;
DelegateTest delegateTest1 = delegate(int x) {
return x*x;
};
i = delegateTest1(i);
Console.WriteLine(i);
第三種方式就是使用Expression Lambda 的語法來完成
int i = 1;
DelegateTest delegateTest2 = (int x) => {
return x*10;
};
i = delegateTest2(i);
Console.WriteLine(i);
這三種方法都是可以在不同情況下做使用,另外還有一種是運用到泛型(Generics)
的方式我這裡就不多作介紹,有興趣的大家可以自己去找看看
今天光介紹型別這裡我就感覺很多東西都不太清楚,也可以知道我目前的實力還沒那麼厲害,今後我也會努力去增進自己的能力,希望今天可以帶給大家一些幫助,哪麼我們就明天見啦~~~
參考內容:
https://hsuchihting.github.io/c/20200420/951951981/
https://ithelp.ithome.com.tw/articles/10233498
https://adon988.hoohoo.top/blog/c-array-teaching-notes-using-visual-studio/
https://mybaseball52.medium.com/handling-null-in-csharp-60eabafe8e22
http://death0400.blogspot.com/2018/01/c-delegate.html